package com.af.experiments.FxCameraApp.shaders; import android.util.Pair; import com.af.experiments.FxCameraApp.renderer.GLES20FramebufferObject; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import static android.opengl.GLES20.glBindFramebuffer; import static android.opengl.GLES20.glClear; import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT; import static android.opengl.GLES20.GL_FRAMEBUFFER; public class GlShaderGroup extends GlShader { private final Collection<GlShader> mShaders; private final ArrayList<Pair<GlShader, GLES20FramebufferObject>> mList = new ArrayList<Pair<GlShader, GLES20FramebufferObject>>(); public GlShaderGroup(final GlShader... shaders) { this(Arrays.asList(shaders)); } public GlShaderGroup(final Collection<GlShader> shaders) { mShaders = shaders; } @Override public void setup() { super.setup(); if (mShaders != null) { final int max = mShaders.size(); int count = 0; for (final GlShader shader : mShaders) { shader.setup(); final GLES20FramebufferObject fbo; if ((count + 1) < max) { fbo = new GLES20FramebufferObject(); } else { fbo = null; } mList.add(Pair.create(shader, fbo)); count++; } } } @Override public void release() { for (final Pair<GlShader, GLES20FramebufferObject> pair : mList) { if (pair.first != null) { pair.first.release(); } if (pair.second != null) { pair.second.release(); } } mList.clear(); super.release(); } @Override public void setFrameSize(final int width, final int height) { super.setFrameSize(width, height); for (final Pair<GlShader, GLES20FramebufferObject> pair : mList) { if (pair.first != null) { pair.first.setFrameSize(width, height); } if (pair.second != null) { pair.second.setup(width, height); } } } private int mPrevTexName; @Override public void draw(final int texName, final GLES20FramebufferObject fbo) { mPrevTexName = texName; for (final Pair<GlShader, GLES20FramebufferObject> pair : mList) { if (pair.second != null) { if (pair.first != null) { pair.second.enable(); glClear(GL_COLOR_BUFFER_BIT); pair.first.draw(mPrevTexName, pair.second); } mPrevTexName = pair.second.getTexName(); } else { if (fbo != null) { fbo.enable(); } else { glBindFramebuffer(GL_FRAMEBUFFER, 0); } if (pair.first != null) { pair.first.draw(mPrevTexName, fbo); } } } } }